kubectl是用於針對K8s cluster 運行命令的接口, 他是用戶最常用來針對API Server發送命令的工具, kubectl採用的是Imperative programming的方式, 從kubectl下達的指令會覆蓋default和任何對應到的環境變量。
這篇只列出常用指令, 指令列表可以參考官網概述。
語法
kubectl [command] [TYPE] [NAME] [flags]
參數說明
command
: 對資源執行操作的命令, ex: get
, create
, delete
, run
....等
TYPE
: 指定資源類型, 不區分大小寫, 可以使用單數,複數或是類型縮寫, ex: pod
, service
, deployment
...等,
TYPE
底下可以指定操作一或多個NAME
kubectl get pod nginx-pod-1 nginx-pod-2
kubectl get pod/nginx-pod-1 service/nginx-service
NAME
: 對象名稱, 有區分大小寫,
flags
: 命令列選項
輸出object配置語法
kubectl [command] [TYPE] [NAME] -o=<output_format>
參數說明
output_format
: 指定輸出格式, 常用格式有
-o wide
- 印出資源額外訊息-o name
- 印出資源名稱-o yaml
- 以yaml格式輸出object配置內容-o json
- 以json格式輸出object配置內容Server-side
決定是否印出Server自動補上的相關資訊, 設定 --server-print=false
表示不印
kubectl get pods <pod-name> --server-print=false
kubectl get pods
回應
NAME READY STATUS RESTARTS AGE
nginx-deploy 1/1 Running 1 2d17h
kubectl get pods nginx-deploy --server-print=false
回應
NAME AGE
nginx-deploy 2d17h
常用操作
kubectl apply: 以directory
的文件內容進行部署或更新
kubectl apply -f <directory>
kubectl get: 列出object列表資源詳細狀態
kubectl get pods
kubectl describe: 顯示一個或多個資源詳細狀態
kubectl describe pod nginx-pod-1
kubectl delete: 從文件或指定的名稱、標籤選擇器、資源選擇緝獲資源中刪除資源
kubectl delete pods --all
kubectl exec: 對 pod 中的容器執行命令
kubectl exec -t pod1 /bin/bash
kubectl log: 印出Pod的log
kubectl logs -f pod1
kubectl port-forward: 轉發一個本地端口到k8s pod上
kubectl port-forward <pod>/<service> <local port>:<remote k8s port>
1.例: k8s上的某台redis服務開的是 6379 port, 我想在本機 6379 port直接使用
kubectl port-forward redis-master-1 6379:6379
kubectl port-forward svc/redis-master 6379:6379
採用其中一個方式 port-forward 下來後就可以在本機使用redis-cli
查看遠端的資料。
2.例:k8s上有一台http服務開的是80 port, 我想在本機 1031使用
kubectl port-forward svc/hello-svc 1031:80
此時就可以直接ping到接口
curl http://127.0.0.1:1031/api/hello
查看其他選項
kubectl options
今天只有看一下概述的部分, 另外還有發現完整列表, 指令超多, 實際應用時會再邊查資料。
Namespace 是K8s Cluster層級的資源, 用來定義K8s cluter管理員層級設定相關配置資訊的object。它將cluster分割成各自獨立的區塊讓不同的用戶或環境可以使用, 在我們團隊中會依照專案與環境切割成不同的Namespace來使用 ex: dev-project1, dev-project2, qa-project1, qa-project2。kubectl create namespace <name>
用來創建namespace, 其中 <name>
只接受英文, 數字, 下底線, 連接線; 在使用kubectl
指令時如果有加上-n <namespace>
那指令就只會作用在指定的namespac上面;另外同一個cluster但是不同namespace中是可以使用同一個資源對象名稱的,跨namespace的pod之間也可以溝通, 因為 namespace 只提供資源對象的隔離, 網路隔離不在它的範疇。
kubectl 上面列的常用指令在我開發過程中最常用的是 port-forward
, 這樣不僅不需要在本機架設服務的環境, 也可以確保接到的版本是正確的版本!